﻿using Interface.DAO;
using JMI_Nucleo.Classe;
using JMI_Nucleo.Enumerador;
using JMI_Nucleo.JMIProvider;
using OR;
using System;
using System.Data;
using System.Data.Common;
using System.Drawing;
using System.IO;

namespace Dao
{
    public class TabelaImagemDao : ITabelaImagemDao<mTabelaImagem>
    {
        private mTabelaImagem infoImagem;
     
        public TabelaImagemDao()
        {
        }

        #region Comando SQL
        const string cmdInsert = @"INSERT INTO cadastro.imggeral(datacadastro, empresa, usuario, dataalteracao, 
                                      ativo, codigo, tabelavinculada, chave, arquivo, imagem)
                                      VALUES (@datacadastro, @empresa, @usuario, @dataalteracao, 
                                      @ativo, @codigo, @tabelavinculada, @chave, @arquivo, @imagem)";

        const string cmdUpdate = @"UPDATE cadastro.imggeral SET usuario =@usuario, dataalteracao =@dataalteracao, 
                                      ativo =@ativo, arquivo =@arquivo, imagem =@imagem ";

        const string cmdDeleteSQL = @"DELETE FROM cadastro.imggeral";

        const string cmdSelectSQL = @"SELECT datacadastro, empresa, usuario, dataalteracao, ativo, codigo, 
                                      tabelavinculada, chave, arquivo, imagem FROM cadastro.imggeral";

        #endregion
  
        #region Metodos
        bool ITabelaImagemDao<mTabelaImagem>.Inserir(mTabelaImagem infoImagem)
        {
            bool sucesso = false;
    
            try
            {
                DbCommand _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                _cmd.CommandText = cmdInsert;
                GeraParametro(ref _cmd, infoImagem, 1);
                _cmd.Prepare();

                sucesso = EngineBD.ExecuteNonQuery(_cmd);
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "bool ITabelaImagemDao<mTabelaImagem>.InserirImagem(mTabelaImagem infoImagem)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
 
            return sucesso;
        }
        bool ITabelaImagemDao<mTabelaImagem>.Alterar(mTabelaImagem infoImagem)
        {
            bool sucesso = false;
            string cmdSQL = String.Empty;
            try
            {
                DbCommand _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                cmdSQL = cmdUpdate;
                cmdSQL += "WHERE tabelavinculada =@tabelavinculada AND chave =@chave";
                _cmd.CommandText = cmdSQL;
                GeraParametro(ref _cmd, infoImagem, 2);
                _cmd.Prepare();

                sucesso = EngineBD.ExecuteNonQuery(_cmd);
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "bool ITabelaImagemDao<mTabelaImagem>.AlterarImagem(mTabelaImagem infoImagem)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }

            return sucesso;
        }
        bool ITabelaImagemDao<mTabelaImagem>.Excluir(string Tabela, int Chave)
        {
            bool sucesso = false;
            string cmdSQL = String.Empty;

            try
            {
                DbCommand _cmd = EngineBD.GetConexao.CreateCommand();

                _cmd.CommandType = CommandType.Text;
                
                cmdSQL = cmdDeleteSQL;
                cmdSQL += " WHERE tabelavinculada = " + Tabela + " AND chave = " + Chave.ToString();
                _cmd.CommandText = cmdSQL;
              
                _cmd.Prepare();

                sucesso = EngineBD.ExecuteNonQuery(_cmd);       
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "bool ITabelaImagemDao.Excluir(string Tabela, int Chave)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            return sucesso;
        }

        mTabelaImagem ITabelaImagemDao<mTabelaImagem>.GetImagem(string Tabela, int Chave)
        {
            infoImagem = new mTabelaImagem();
            DbDataReader rd = null;
            DbCommand _cmd = null;
            string cmdSQL = String.Empty;

            try
            {
                if (EngineBD.GetConexao.State == ConnectionState.Closed)
                    EngineBD.Conectar();
                _cmd = EngineBD.GetConexao.CreateCommand();
                _cmd.CommandType = CommandType.Text;
                cmdSQL = cmdSelectSQL;
                cmdSQL += " WHERE tabelavinculada = '" + Tabela + "' AND chave = " + Chave.ToString();
                _cmd.CommandText = cmdSQL;
                
                rd = EngineBD.ExecuteDataReader(_cmd);
                
                if (rd.Read())
                    infoImagem = GetRdImagem(rd);
            }
            catch (Exception ex)
            {
                #region Grava log local
                mLog _info = new mLog();
                _info._TipoErro = TipoErro.Erro;
                _info.Mensagem = "Erro ao executar comando. " + ex.Message;
                _info.Metodo = "mTabelaImagem ITabelaImagemDao.GetImagem(string Tabela, int Chave)";
                _info.StackTrace = ex.StackTrace;
                _info.Tabela = String.Empty;
                LogLocal.Info = _info;
                LogLocal.Gravar();
                #endregion
            }
            return infoImagem;
        }        
        #endregion

        #region Metodos privados
        private void GeraParametro(ref DbCommand _cmd, mTabelaImagem infoImagem, byte Acao)
        {
            _cmd.Parameters.Clear();

            if (Acao == 1)
            {
                UtilBD.AdicionaParametro(ref _cmd, "@codigo", infoImagem.Codigo);
                UtilBD.AdicionaParametro(ref _cmd, "@empresa", infoImagem.Empresa);
                UtilBD.AdicionaParametro(ref _cmd, "@datacadastro", infoImagem.DataCadastro);                
            }            
            UtilBD.AdicionaParametro(ref _cmd, "@usuario", infoImagem.Usuario);
            UtilBD.AdicionaParametro(ref _cmd, "@dataalteracao", infoImagem.DataAlteracao);
            UtilBD.AdicionaParametro(ref _cmd, "@ativo", infoImagem.Ativo);
            UtilBD.AdicionaParametro(ref _cmd, "@arquivo", infoImagem.Arquivo);
            UtilBD.AdicionaParametro(ref _cmd, "@imagem", infoImagem.ImgByte);
            UtilBD.AdicionaParametro(ref _cmd, "@tabelavinculada", infoImagem.TabelaVinculada);
            UtilBD.AdicionaParametro(ref _cmd, "@chave", infoImagem.Chave);
        }
        private mTabelaImagem GetRdImagem(DbDataReader rd)
        {
            infoImagem = new mTabelaImagem();

            infoImagem.Arquivo = rd["arquivo"].ToString();
            infoImagem.Ativo = Convert.ToBoolean(rd["ativo"]);
            infoImagem.Chave = Convert.ToInt32(rd["chave"]);
            infoImagem.Codigo = Convert.ToInt32(rd["codigo"]);
            infoImagem.DataAlteracao = Convert.ToDateTime(rd["dataalteracao"]);
            infoImagem.TabelaVinculada = rd["tabelavinculada"].ToString();
            infoImagem.ImgByte = (byte[])rd["imagem"];
            return infoImagem;
        }
        #endregion
    }
}
